package pe.com.ztaxi.taxis.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import pe.com.ztaxi.taxis.dao.OrdenServicioDAO;
import pe.com.ztaxi.taxis.dao.PasajeroDAO;
import pe.com.ztaxi.taxis.model.Pasajero;
import pe.com.ztaxi.taxis.service.PasajeroService;

@Service
public class PasajeroServiceImpl implements PasajeroService {

	private static final Logger LOGGER = LoggerFactory
			.getLogger(PasajeroServiceImpl.class);

	@Resource
	private PasajeroDAO pasajeroDAO;
	
	@Resource
	private OrdenServicioDAO ordenServicioDAO;

	@Transactional(readOnly = true)
	public Pasajero buscarPorCodigo(Integer codigoPasajero){
		LOGGER.debug("Buscando pasajero con codigo: " + codigoPasajero);
		return pasajeroDAO.findOne(codigoPasajero);
	}
	
	@Transactional(readOnly = true)
	public Pasajero buscarPorCodigo(Integer codigoPasajero, Integer numeroMaximoOrdenes){
		LOGGER.debug("Buscando pasajero con codigo: " + codigoPasajero);
		Pasajero pasajero = pasajeroDAO.findOne(codigoPasajero);
		Pageable topTen = new PageRequest(0, numeroMaximoOrdenes);
		pasajero.setOrdenesDeServicio(ordenServicioDAO.buscarPorPasajero(pasajero.getCodigo(), topTen));
		return pasajero;
	}
	
	@Transactional(readOnly = true)
	public List<Pasajero> buscarPorEmpresa(Integer codigoEmpresa){
		LOGGER.debug("Buscando pasajero de empresa con codigo: " + codigoEmpresa);
		return pasajeroDAO.buscarPorEmpresa(codigoEmpresa);
	}
	
	@Transactional(readOnly = true)
	public List<Pasajero> buscarPorEmpresa(Integer codigoEmpresa, Integer numeroMaximoOrdenes){
		LOGGER.debug("Buscando pasajero de empresa con codigo: " + codigoEmpresa);
		List<Pasajero> pasajeros = pasajeroDAO.buscarPorEmpresa(codigoEmpresa);
		for(Pasajero pasajero: pasajeros){
			Pageable topTen = new PageRequest(0, numeroMaximoOrdenes);
			pasajero.setOrdenesDeServicio(ordenServicioDAO.buscarPorPasajero(pasajero.getCodigo(), topTen));
		}
		return pasajeros;
	}
	
	@Transactional(readOnly = true)
	public List<Pasajero> buscarTodos(Integer numeroMaximoOrdenes){
		LOGGER.debug("Buscando pasajeros");
		List<Pasajero> pasajeros = pasajeroDAO.findAll();
		for(Pasajero pasajero: pasajeros){
			Pageable topTen = new PageRequest(0, numeroMaximoOrdenes);
			pasajero.setOrdenesDeServicio(ordenServicioDAO.buscarPorPasajero(pasajero.getCodigo(), topTen));
		}
		return pasajeros;		
	}
	
}
